package com.csust.automaticteach.utils;

import cn.hutool.crypto.symmetric.AES;
import cn.hutool.core.util.CharsetUtil;
import com.csust.automaticteach.exception.BusinessException;
import com.csust.automaticteach.exception.ErrorCode;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.util.Base64;

// 加密工具类（密钥需在配置文件中配置，避免硬编码）
@Component
public class ShareEncryptUtil {
    // AES 密钥（16位/24位/32位，从配置文件读取）
    @Value("${share.aes.key}")
    private String aesKey;

    // 生成分享 Token：加密（bizType + "|" + bizId + "|" + 过期时间戳）

    /**
     * 生成分享 Token
     * @param bizType bizType 业务类型
     * @param bizId bizId 业务数据 ID
     * @param expireSeconds 过期时间戳
     * @return
     */
    public String generateShareToken(String bizType, String bizId, long expireSeconds) {
        // 计算过期时间（当前时间 + 有效期，单位：毫秒）
        long expireTime = System.currentTimeMillis() + expireSeconds * 1000;
        // 拼接原始字符串：业务类型|数据ID|过期时间
        String original = String.join("|", bizType, bizId, String.valueOf(expireTime));
        // AES 加密
        AES aes = new AES(aesKey.getBytes(StandardCharsets.UTF_8));
        byte[] encrypted = aes.encrypt(original);
        // 转 Base64 方便拼接在 URL 中
        return Base64.getEncoder().encodeToString(encrypted);
    }


    /**
     * 解密Token 并验证合法性
     * @param token 分享Token
     * @return ShareInfo
     */
    public ShareInfo decryptAndVerifyToken(String token) {
        try {
            // Base64 解码
            byte[] decoded = Base64.getDecoder().decode(token);
            // AES 解密
            AES aes = new AES(aesKey.getBytes(StandardCharsets.UTF_8));
            String original = aes.decryptStr(decoded, CharsetUtil.CHARSET_UTF_8);
            // 拆分参数
            String[] parts = original.split("\\|");
            if (parts.length != 3) {
                throw new BusinessException(ErrorCode.OPERATION_ERROR,"无效的分享链接");
            }
            String bizType = parts[0];
            String bizId = parts[1];
            long expireTime = Long.parseLong(parts[2]);

            // 验证是否过期
            if (System.currentTimeMillis() > expireTime) {
                throw new BusinessException(ErrorCode.OPERATION_ERROR,"分享链接已过期");
            }

            return new ShareInfo(bizType, bizId);
        } catch (Exception e) {
            throw new BusinessException(ErrorCode.OPERATION_ERROR,"分享链接无效：" + e.getMessage());
        }
    }

    // 封装解密后的信息
    @Data
    @AllArgsConstructor
    public static class ShareInfo {
        private String bizType;
        private String bizId;
    }
}